;##################################
;命令：
;nasm -f elf64 day8_0struct_1bss.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;id = 1, name = 于潇洋
;##################################
extern printf

section .data
	msg: db `id = %d, name = %s\n`, 0
	yuxiaoyang_name: db `于潇洋`, 0

;#####################################
	;请注意
	;C语言中无string对象
	;char*代表的是指针
	;struct student{
	;    int id;
	;    char* name;
	;};
	;在打印语句中
	;存入寄存器的char*是一个内存地址
	;这个例子与上个例子的区别是
	;上个例子的name是string
	;这个例子的name是指针
	struc student
	.id: resd 1
	.name: resq 1
	endstruc

section .bss
	stu1: resb student_size
;#####################################
section .text
	global main

main:
	push rbp
	mov rbp, rsp

;############################################################################
	mov dword [stu1 + student.id], 1
	;string的赋值是重中之重
	;从内存移入寄存器又移入内存
	;其中转移的是内存地址
	;stu1 + student.name是内存地址
	;[stu1 + student.name]是值
	;rax保存的是指向yuxiaoyang_name的内存地址
	;[stu1 + student.name]保存的是指向yuxiaoyang_name的内存地址
	mov rax, yuxiaoyang_name
	mov qword [stu1 + student.name], rax
;############################################################################

;############################################################################
	;打印
	mov rdi, msg
	movsxd rsi, dword [stu1 + student.id]
	;[stu1 + student.name]保存的是指向yuxiaoyang_name的内存地址
	mov rdx, [stu1 + student.name]
	call printf

;############################################################################

	mov eax, 0
	leave
	ret
